In [1]:
%pylab inline
from datetime import date, timedelta, datetime


Populating the interactive namespace from numpy and matplotlib

Load the data


In [2]:
with load('data/numpy/SPY.npz') as loadData:
    
    optionroot = loadData['optionroot']
    quotedate = loadData['quotedate']
    expiration = loadData['expiration']
    underlying = loadData['underlying']
    call_put = loadData['call_put']
    strike = loadData['strike']
    last = loadData['last']
    bid = loadData['bid']
    ask = loadData['ask']
    volume = loadData['volume']
    impliedvol = loadData['impliedvol']
    delta = loadData['delta']
    gamma = loadData['gamma']
    theta = loadData['theta']
    vega = loadData['vega']

Pull out the index for each day


In [3]:
ref = find(~(quotedate[0:-1] == quotedate[1:]))
ref = ref + 1
ref = append(0,ref)
ref


Out[3]:
array([      0,    2512,    5024, ..., 3365603, 3369335, 3373205])

In [4]:
tradingDays = quotedate[ref]
tradingDays


Out[4]:
array([datetime.date(2009, 9, 1), datetime.date(2009, 9, 2),
       datetime.date(2009, 9, 3), ..., datetime.date(2014, 10, 22),
       datetime.date(2014, 10, 23), datetime.date(2014, 10, 24)], dtype=object)

In [5]:
ticker = underlying[ref]
ticker


Out[5]:
array([ 100.2 ,   99.82,  100.65, ...,  192.69,  194.93,  196.43])

In [6]:
plot(tradingDays,ticker)


Out[6]:
[<matplotlib.lines.Line2D at 0x7f1222d9fa20>]

Contract Length


In [7]:
contractLength = expiration - quotedate

def pullDays(x):
    
    return x.days

pullDays = vectorize(pullDays)

contractDaysLeft = pullDays(contractLength)

contractDaysLeft


Out[7]:
array([ 18,  18,  18, ..., 785, 785, 785])

Testing Emulation

Setting up


In [100]:

Testing Loop


In [127]:
exposure = 10
bank = zeros(len(tradingDays) + 1)

bank[0] = 10000

# holdings = dict()
holdings['optionroot'] = array([])
holdings['numContracts'] = array([])



for i in range(len(tradingDays)):
    
    currentDay = tradingDays[i]
    
    if shape(holdings['optionroot'])[0] == 0:  # If you haven't taken out a position, take one out


        ref = (quotedate == currentDay) & (call_put == 'put') & (contractDaysLeft < 40)

        lengthChoice = contractDaysLeft[ref].max()

        ref = ref & (contractDaysLeft == lengthChoice)

        deltaChoice = abs(delta)[ref][(abs(delta[ref])>0.3)].min()

        ref = ref & (abs(delta) == deltaChoice)

        


        # Purchase
        numContracts = bank[i] * exposure // (strike[ref] * 100)

        bank[i] += numContracts * last[ref]*100
        holdings['optionroot'] = append(holdings['optionroot'],optionroot[ref][0])
        holdings['numContracts'] = append(holdings['numContracts'],numContracts)
#         holdings['purchasePrice']
        
#         print(("Purchased:\n Root: %s\n Strike: %0.2f \n"+
#                " Last: %0.2f \n Bid: %0.2f \n"+
#                " Ask: %0.2f \n Volume: %d\n\n"+
#                "Current Bank: %0.2f") 
#               %(optionroot[ref][0],strike[ref],last[ref],bid[ref],ask[ref],volume[ref],bank[i]))


    else:

        ref = (quotedate == currentDay) & (call_put == 'put') & (optionroot == holdings['optionroot'][0])

        if last[ref] < 0.3:
            
#             print("  Root: %s\nStrike: %0.2f \n  Last: %0.2f \n   Bid: %0.2f \n   Ask: %0.2f \nVolume: %d" 
#                   %(optionroot[ref][0],strike[ref],last[ref],bid[ref],ask[ref],volume[ref]))

            bank[i] -= holdings['numContracts'][0] * last[ref]*100
            holdings['optionroot'] = array([])
            holdings['numContracts'] = array([])

            
        
        
        elif contractDaysLeft[ref] < 2:
            
#             print("  Root: %s\nStrike: %0.2f \n  Last: %0.2f \n   Bid: %0.2f \n   Ask: %0.2f \nVolume: %d" 
#                   %(optionroot[ref][0],strike[ref],last[ref],bid[ref],ask[ref],volume[ref]))
            
            bank[i] -= holdings['numContracts'][0] * last[ref]*100
            holdings['optionroot'] = array([])
            holdings['numContracts'] = array([])

    if bank[i] < 10:
        
        break
        
    
    bank[i+1] = bank[i]

In [132]:
shape(holdings['optionroot'])[0]


Out[132]:
1

In [133]:
holdings['numContracts']


Out[133]:
array([ 10.])

In [134]:
i


Out[134]:
1296

In [142]:
figure(figsize=(16,8))

plot(tradingDays,bank[1:])
plot(tradingDays,ticker)

grid(True)



In [157]:
fig, ax1 = plt.subplots(figsize=(16,8))
t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(tradingDays,bank[1:],'b')
ax1.set_xlabel('Time (Years)')
# Make the y-axis label and tick labels match the line color.
ax1.set_ylabel('Bank Account ($)', color='b')
for tl in ax1.get_yticklabels():
    tl.set_color('b')

grid(True)

ax2 = ax1.twinx()
s2 = np.sin(2*np.pi*t)
ax2.plot(tradingDays,ticker,'r')
ax2.set_ylabel('The Underlying ($)', color='r')
for tl in ax2.get_yticklabels():
    tl.set_color('r')

    
title('Initial basic strategy -- Writing puts')

grid(True)



In [ ]: